﻿
#ifndef __AmapView_H__
#define __AmapView_H__

#include "CrossApp.h"

USING_NS_CC;

//地图上的点标记
class AmapMarker : public CAObject
{
public:

	AmapMarker(string imgurl, bool draggable, string title, string content, double lat, double lng) 
		: m_strImg(imgurl), 
		m_bDraggable(draggable),
		m_strTitle(title),
		m_strContent(content),
		m_dLat(lat),
		m_dLng(lng){}

	const string& getImg()
	{
		return m_strImg;
	}

	bool getDraggable()
	{
		return m_bDraggable;
	}

	const string& getTitle()
	{
		return m_strTitle;
	}

	const string& getContent()
	{
		return m_strContent;
	}

	double getLat()
	{
		return m_dLat;
	}

	double getLng()
	{
		return m_dLng;
	}

private:

	string m_strImg;//图标，可以不设置，有默认图片的
	bool m_bDraggable;//是否可拖动
	string m_strTitle;//点击marker显示的窗口中标题
	string m_strContent;//点击marker显示的窗口中内容
	double m_dLat;//marker纬度
	double m_dLng;//marker经度
};

struct RouteStep
{
	float distance;//距离，以米为单位
	float duration;//所需时间，以秒为单位
	string instruct;//具体说明(包含方向)
	string orientation;//方向

	RouteStep() :distance(0.0f), duration(0.0f){}
};

struct DriveRouteData
{
	double slat;//起点经度
	double slng;//起点纬度
	double elat;//目标点经度
	double elng;//目标点纬度

	int distance;//总距离，以米为单位
	int duration;//总时间，以秒为单位
	string desctription;//格式化的距离+时间
	float taxiCost;//打的费用

	std::vector<RouteStep> v_steps;

	DriveRouteData() :slat(-1000), slng(-1000), elat(-1000), elng(-1000), distance(0), duration(0), taxiCost(0.0f){}
};

struct WalkRouteData
{
	double slat;//起点经度
	double slng;//起点纬度
	double elat;//目标点经度
	double elng;//目标点纬度

	int distance;//总距离，以米为单位
	int duration;//总时间，以秒为单位
	string description;//格式化的距离+时间

	std::vector<RouteStep> v_steps;

	WalkRouteData() :slat(-1000), slng(-1000), elat(-1000), elng(-1000), distance(0), duration(0){}
};

struct BusRouteStep
{
	//类型，1、步行，2、公交，3、地铁，4、出租车
	int type;
	string name;
	float distance;
	float duration;
	string stations;//2、公交，3、地铁路过的站，用/分割。

	BusRouteStep() :type(0), distance(0.0f), duration(0.0f){}
};

struct BusRouteData
{
	double slat;//起点经度
	double slng;//起点纬度
	double elat;//目标点经度
	double elng;//目标点纬度

	int distance;//总距离，以米为单位
	int duration;//总时间，以秒为单位
	float cost;//花费
	string pathTitle;//线路具体说明
	string pathDes;//格式化的时间+距离+步行距离

	float busDistance;//公交距离
	float walkDistance;//步行距离

	int tag;//对应的标签

	BusRouteData() :slat(-1000), slng(-1000), elat(-1000), elng(-1000), tag(0), distance(0), duration(0), cost(0.0f), busDistance(0.0f), walkDistance(0.0f){}
};

enum AmapRouteViewType
{
	DriveRoute_Type = 1,
	BusRoute_Type,
	WalkRoute_Type
};

class AmapViewImpl;

//回调都不是ui线程，通过CASchedule回到主线程
class AmapViewDelegate
{
public:

	//地图加载成功回调，ios没有此方法
	virtual void onAmapLoaded(){};
	
	//地图点击回调
	virtual void onAmapClicked(double lat, double lng){};

	//地图marker拖拽回调
	//lat,lng是拖动的新的经纬度
	virtual void onAmapMarkerDragStart(AmapMarker* marker, double lat, double lng){};
	virtual void onAmapMarkerDrag(AmapMarker* marker, double lat, double lng){};
	virtual void onAmapMarkerDragEnd(AmapMarker* marker, double lat, double lng){};
	
	//地图marker点击事件
	virtual void onAmapMarkerClick(AmapMarker* marker){};
	
	//地图marker的InfoWindow点击
	virtual void onAmapMarkerInfoWindowClick(AmapMarker* marker){};

	//地图右上角定位按钮的回调
	//code表示定位成功与否，0表示定位并获取地理信息成功，-1表示定位成功但获取地理信息失败，-2表示都失败
    //lat经度
    //lng纬度
    //formatAddr完整地址
    //province省 city市 district区 street街道 number门牌 poi兴趣点 adcode地区编码
	virtual void onAmapLocationEnd(int code, double lat, double lng, const string& formatAddr, const string& province, const string& city, const string& district, const string& street, const string& number, const string& poi, const string& adcode){};

	//驾车路线回调 code为0成功
	virtual void onDriveRouteSearched(int code, DriveRouteData data){};

	//驾车路线回调 code为0成功
	virtual void onWalkRouteSearched(int code, WalkRouteData data){};

	//公交路线回调 code为0成功
	virtual void onBusRouteSearched(int code, std::vector<BusRouteData> data){};

	//公交一个路线步骤 code为0成功
	virtual void onBusRouteSteps(int code, int bustag, std::vector<BusRouteStep> datas){};
};

class AmapView : public CAView
{
public:

	AmapView();
    
	virtual ~AmapView();

	static AmapView* createWithFrame(const DRect& rect);

	static AmapView* createWithCenter(const DRect& rect);

	static AmapView* createWithLayout(const DLayout& layout);

	//设置地图中心点
	void setMapCenter(double lat, double lng);

    //定位，单次定位，不是连续定位的
	void startLocation();

	//设置地图缩放level（Android 3.0-19.0）,默认10.0
	void setMapZoomLevel(float level);

	//设置可见
	virtual void setVisible(bool visible);

    //marker new过之后在调用addMarker之后需要release，但是不需要滞空
	void addMarker(AmapMarker* marker);

    //删除指定的marker
	void deleteMarker(AmapMarker* marker);

    //获取你添加的所有marker，key值没有太多作用
	std::map<string, AmapMarker*>& getAllMarkers();

    //清理所有的marker
	void clearMarkers();

	//slat slng 起点经纬度
	//elat elng 终点经纬度
	void setAmapRouteViewType(double slat, double slng, double elat, double elng, AmapRouteViewType type);

	//公交路线规划时，需要在searchRoute之前调用
	//city表示起始地的城市
	//cityd表示目的地的城市， 如果涉及跨城市公交，需要此参数
	void setBusRouteCity(const string& city, const string& cityd = "");

	//开始路线规划
	void searchRoute();

	//显示公交地图上路线
	void showBusRouteView(const int busTag);

	//获取bustag公交线路的具体路线
	void getBusRouteStep(int bustag);

	CC_SYNTHESIZE(AmapViewDelegate*, m_pAmapViewDelegate, AmapViewDelegate);

	//无需调用
	virtual void onEnterTransitionDidFinish();
	//无需调用
	virtual void onExitTransitionDidStart();

private:

	virtual void update(float dt);

	AmapViewImpl *_impl;

	DPoint m_obLastPoint;

    DSize m_obLastContentSize;
};

#endif
